package com.chat.api.common.exception;

import com.chat.api.web.vo.MessageEntity;
import lombok.extern.slf4j.Slf4j;
import org.springframework.core.annotation.Order;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;

/**
 * 全局的的异常拦截器（拦截所有的控制器）（带有@RequestMapping注解的方法上都会拦截）
 *  
 * @author zjp
 */
@ControllerAdvice
@Order(-999)
@Slf4j
public class DefaultExceptionHandler {
	private static final String DEFAULT_ERROR_VIEW = "/error/exception";
    /**
     * 页面类型：拦截业务异常
     */
    @ExceptionHandler(ServiceException.class)
    public ModelAndView serviceErrorHandler(HttpServletRequest request, ServiceException e) {
    	log.error(CoreExceptionEnum.E_SYS.getMessage(), e);
        ModelAndView m = new ModelAndView();
        m.addObject("exception", e);
        m.addObject("url", request.getRequestURL());
        m.setViewName(DEFAULT_ERROR_VIEW);
        return m;
    }

    /**
     * Restful类型：拦截API接口异常 add by peidx@20181213
     */
//    @ExceptionHandler(ApiException.class)
//    @ResponseBody
//    public MessageEntity<Object> apiErrorHandler(HttpServletRequest req, ApiException e) {
//        log.error(CoreExceptionEnum.E_SYS.getMessage(), e);
//        if(e.getErrorMessage()==null || e.getErrorMessage().isEmpty()) {
//            return new MessageEntity<Object>(CoreExceptionEnum.E_SYS);
//        } else {
//            return new MessageEntity<Object>(CoreExceptionEnum.E_SYS.getCode(), e.getErrorMessage());
//        }
//
//    }
//
//    /**
//     * Restful类型：拦截API接口异常 返回406 不出发前端弹窗拦截器
//     */
//    @ExceptionHandler(ParamException.class)
//    @ResponseBody
//    public MessageEntity<Object> paramErrorHandler(HttpServletRequest req, ParamException e) {
//        log.error(CoreExceptionEnum.E_INVALID_PARAM.getMessage(), e.getMessage());
//        if(e.getErrorMessage()==null || e.getErrorMessage().isEmpty()) {
//            return new MessageEntity<Object>(CoreExceptionEnum.E_INVALID_PARAM);
//        } else {
//            return new MessageEntity<Object>(CoreExceptionEnum.E_INVALID_PARAM.getCode(), e.getErrorMessage());
//        }
//
//    }

    /**
     * 页面类型：拦截未知的运行时异常
     */
    @ExceptionHandler(Exception.class)
    public MessageEntity<Object>  defaultErrorHandler(HttpServletRequest request, Exception e) {
        log.error("defaultErrorHandler", e);
        return new MessageEntity<Object>(CoreExceptionEnum.E_SYS.getCode(), e.getLocalizedMessage());
    }


}
